﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataAccessLayer;
using DTO;
using System.Configuration;
using System.Data;

namespace DAL
{
    public class ThamSoDAL
    {
        private DBManager _dbmanager;

        #region Phương thức khởi tạo mặc định
        /// <summary>
        /// Phương thức khởi tạo mặc định
        /// </summary>
        public ThamSoDAL()
        {
            string _connectionInfo = ConfigurationManager.AppSettings["ConnectionInfo"];
            _dbmanager = new DBManager(DataProvider.SqlServer, _connectionInfo);
        }
        #endregion

        #region Phương thức tạo 1 object từ Data Reader       
        private ThamSoDTO CreateThamSoFromReader(IDataReader reader)
        {
            ThamSoDTO _tsDTO = new ThamSoDTO();
            _tsDTO.MaThamSo = Convert.ToInt32(reader["MaThamSo"]);
            _tsDTO.TenThamSo = Convert.ToString(reader["TenThamSo"]);
            _tsDTO.GiaTri = Convert.ToString(reader["GiaTri"]);
            _tsDTO.MoTa = Convert.ToString(reader["MoTa"]);
            return _tsDTO;
        }
        #endregion

        #region Phương thức lấy danh sách tham số       
        public List<ThamSoDTO> GetListThamSo()
        {

            List<ThamSoDTO> _lst = new List<ThamSoDTO>();
            IDataReader _reader = null;
            try
            {
                _dbmanager.Open();
                _reader = _dbmanager.ExecuteReader(CommandType.StoredProcedure, "usp_getListThamSo");
                while (_reader.Read())
                    _lst.Add(this.CreateThamSoFromReader(_reader));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_reader != null)
                    _reader.Close();
            }
            return _lst;
            
        }
        #endregion

        #region Phương thức lấy thông tin 1 tham số dựa vào mã tham số
        
        public ThamSoDTO GetThamSo(int mats)
        {
            
            ThamSoDTO _tsDTO = new ThamSoDTO();
            IDataReader _reader = null;
            try
            {
                _dbmanager.Open();
                _dbmanager.CreateParameters(1);
                _dbmanager.AddParameters(0, "@ma_ts", mats);
                _reader = _dbmanager.ExecuteReader(CommandType.StoredProcedure, "usp_getThamSo");
                while (_reader.Read())
                    _tsDTO = this.CreateThamSoFromReader(_reader);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_reader != null)
                    _reader.Close();
            }
            return _tsDTO;
            
        }
        #endregion

        #region Phương thức thêm 1 tham số 
        public int Them(ThamSoDTO ts)
        {
            
            int _index = -1;
            try
            {
                // Mở kết nối
                _dbmanager.Open();

                // Thực thi câu truy vấn                
                _dbmanager.CreateParameters(3);
                //_dbmanager.AddParameters(0, "@ma_tsDTO", ts.MaThamSo); -- Generation
                
                _dbmanager.AddParameters(0, "@ten_ts", ts.TenThamSo);
                _dbmanager.AddParameters(1, "@giatri", ts.GiaTri);
                _dbmanager.AddParameters(2, "@mota", ts.MoTa);
                _index = _dbmanager.ExecuteNonQuery(CommandType.StoredProcedure, "usp_ThemThamSo");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_dbmanager.Connection.State == ConnectionState.Open)
                    _dbmanager.Close();
            }

            return _index;
            
        }
        #endregion

        #region Phương thức sửa thông tin 1 tham số
        /// <summary>
        /// Phương thức sửa thông tin 1 tham số
        /// </summary>
        /// <param name="lsgd"></param>
        /// <returns></returns>
        public int Sua(ThamSoDTO ts)
        {
            
            int _index = -1;
            try
            {
                // Mở kết nối
                _dbmanager.Open();

                // Thực thi câu truy vấn                
                _dbmanager.CreateParameters(4);
                _dbmanager.AddParameters(0, "@ma_ts", ts.MaThamSo);
                _dbmanager.AddParameters(1, "@ten_ts", ts.TenThamSo);
                _dbmanager.AddParameters(2, "@giatri", ts.GiaTri);
                _dbmanager.AddParameters(3, "@mota", ts.MoTa);

                _index = _dbmanager.ExecuteNonQuery(CommandType.StoredProcedure, "usp_CapNhatThamSo");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_dbmanager.Connection.State == ConnectionState.Open)
                    _dbmanager.Close();
            }

            return _index;
            
        }
        #endregion

        #region Phương thức xóa 1 tham số
        /// <summary>
        /// Phương thức xóa 1 tham số
        /// </summary>
        /// <param name="ts"></param>
        /// <returns></returns>
        public int Xoa(ThamSoDTO ts)
        {            
            int _index = -1;
            try
            { 
                // Mở kết nối
                _dbmanager.Open();

                // Thực thi câu truy vấn
                _dbmanager.CreateParameters(1);
                _dbmanager.AddParameters(0, "@ma_ts", ts.MaThamSo);
                _index = _dbmanager.ExecuteNonQuery(CommandType.StoredProcedure, "usp_XoaThamSo");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_dbmanager.Connection.State == ConnectionState.Open)
                    _dbmanager.Close();
            }

            return _index;

        }
        #endregion
    }
}
